#!/bin/bash
# (C) 2006, 2007, 2008 LW Inc. <http://www.lw.com>
# 
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#   
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#   
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301 USA

_init ()
{
    # log level definitions
    LOG_NONE=NONE;
    LOG_CRITICAL=CRITICAL;
    LOG_ERROR=ERROR;
    LOG_WARNING=WARNING;
    LOG_NORMAL=NORMAL
    LOG_DEBUG=DEBUG;
    LOG_TRACE=TRACE;

    # set default log level to NORMAL
    log_level=$LOG_NORMAL;
    prefix="@prefix@";
    exec_prefix=@exec_prefix@;
    cmd_line=$(echo "@sbindir@/lwfs");
}

start_lwfs ()
{
    if [ -n "$log_level_str" ]; then
	case "$log_level_str" in
	    "ERROR")
		log_level=$LOG_ERROR;
		;;
            "NORMAL")
                log_level=$LOG_NORMAL
                ;;
	    "DEBUG")
		log_level=$LOG_DEBUG;
		;;
	    "CRITICAL")
		log_level=$LOG_CRITICAL;
		;;
	    "WARNING")
		log_level=$LOG_WARNING;
		;;
	    "TRACE")
		log_level=$LOG_TRACE;
		;;
	    "NONE")
		log_level=$LOG_NONE;
		;;
	    *)
		echo "invalid log level $log_level_str, using NORMAL";
		log_level=$LOG_NORMAL;
		;;
	esac
    fi
    cmd_line=$(echo "$cmd_line --log-level=$log_level");
    
    if [ -n "$log_file" ]; then
	cmd_line=$(echo "$cmd_line --log-file=$log_file");
    fi

    if [ -n "$volfile_check" ]; then
	cmd_line=$(echo "$cmd_line --volfile-check");
    fi

    if [ -n "$direct_io_mode" ]; then
	cmd_line=$(echo "$cmd_line --disable-direct-io-mode");
    fi

    if [ -n "$volume_name" ]; then
        cmd_line=$(echo "$cmd_line --volume-name=$volume_name");
    fi
    
    if [ -n "$log_server" ]; then
        if [ -n "$log_server_port" ]; then
            cmd_line=$(echo "$cmd_line \
--log-server=$log_server \
--log-server-port=$log_server_port");
        fi
    fi

    if [ -z "$volfile_loc" ]; then
        if  [ -n "$server_ip" ]; then
            cmd_line=$(echo "$cmd_line --volfile-server-port=$server_port");
	    if [ -n "$transport" ]; then 
                cmd_line=$(echo "$cmd_line --volfile-server-transport=$transport");
            fi
            if [ -n "$volume_id" ]; then
                cmd_line=$(echo "$cmd_line --volfile-id=$volume_id");
            fi

            if [ -n "$backupvolfile_server" ]; then
                cmd_line1=$(echo "$cmd_line --volfile-server=$backupvolfile_server");
            fi

	    cmd_line=$(echo "$cmd_line --volfile-server=$server_ip");
        fi
    else
        cmd_line=$(echo "$cmd_line --volfile=$volfile_loc");
    fi
    
    cmd_line=$(echo "$cmd_line $mount_point");
    $cmd_line;

    # retry the failover 
    if [ $? != "0" ]; then
        if [ -n "$cmd_line1" ]; then
            cmd_line1=$(echo "$cmd_line1 $mount_point");
            $cmd_line1
        fi
    fi

}

usage ()
{

echo "Usage:  mount.lwfs <volumeserver>:<volumeid/volumeport> -o <options> <mountpoint> 
Options: 
man 8 mount.lwfs 

To display the version number of the mount helper: 
mount.lwfs --version"

}

main ()
{
    helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p');

    options=$(echo "$@" | sed -n 's/.*\-o[ ]*\([^ ]*\).*/\1/p');

    new_log_level=$(echo "$options" | sed -n 's/.*log-level=\([^,]*\).*/\1/p');
    
    [ -n "$new_log_level" ] && {
	log_level_str="$new_log_level";
    }

    log_file=$(echo "$options" | sed -n 's/.*log-file=\([^,]*\).*/\1/p');

    transport=$(echo "$options" | sed -n 's/.*transport=\([^,]*\).*/\1/p');

    direct_io_mode=$(echo "$options" | sed -n 's/.*direct-io-mode=\([^,]*\).*/\1/p');

    volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p');

    volume_id=$(echo "$options" | sed -n 's/.*volume_id=\([^,]*\).*/\1/p');

    volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p');

    server_port=$(echo "$options" | sed -n 's/.*server-port=\([^,]*\).*/\1/p');
    backupvolfile_server=$(echo "$options" | sed -n 's/.*backupvolfile-server=\([^,]*\).*/\1/p');

    log_server=$(echo "$options" | sed -n 's/.*log-server=\([^,]*\).*/\1/p');
    
    log_server_port=$(echo "$options" | sed -n 's/.*log-server-port=\([^,]*\).*/\1/p');
   
    volfile_loc="$1";
    
    [ -r "$volfile_loc" ] || {
	server_ip=$(echo "$volfile_loc" | sed -n 's/\([^\:]*\).*/\1/p');
        test_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p');
        [ -n "$test_str" ] && {
            # Backward compatibility
            test_str1=$(echo "$test_str" | sed -e 's/[0-9]//g');
            [ -n "$test_str1" ] && {
                volume_id="$test_str";
            } || {
                server_port=$test_str;
            }
        } 
	volfile_loc="";
    }

    [ -n "$server_port" ] || {
        server_port="6996";
    }

    new_fs_options=$(echo "$options" | sed -e 's/[,]*log-file=[^,]*//' \
        -e 's/[,]*log-level=[^,]*//' \
        -e 's/[,]*volume-name=[^,]*//' \
        -e 's/[,]*direct-io-mode=[^,]*//' \
        -e 's/[,]*volfile-check=[^,]*//' \
        -e 's/[,]*transport=[^,]*//' \
        -e 's/[,]*backupvolfile-server=[^,]*//' \
        -e 's/[,]*server-port=[^,]*//' \
        -e 's/[,]*volume-id=[^,]*//' \
        -e 's/[,]*log-server=[^,]*//' \
        -e 's/[,]*log-server-port=[^,]*//');

    # 
    [ -n "$helper" ] && {
        cmd_line=$(echo "$cmd_line --$helper");
        exec $cmd_line;
        exit 0;
    }

    mount_point=""
    for arg in "$@"; do
        [ -d "$arg" ] && {
            mount_point=$arg
        }
    done

    [ -z "$mount_point" ] && {
        usage;
        exit 0;
    }

    # Simple check to avoid multiple identical mounts
    if grep -q " $mount_point fuse" /etc/mtab; then
        echo -n "$0: according to mtab, LWFS is already mounted on "
        echo "$mount_point"
        sleep 1;
        exit 0;
    fi

    fs_options=$(echo "$fs_options,$new_fs_options");
    
    start_lwfs;

    sleep 3;
}

_init "$@" && main "$@";

